package main

import (
	"bufio"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"os"
	"os/exec"
	"path/filepath"
	"strings"
	"text/tabwriter"

	"github.com/mozillazg/go-pinyin"
)

type Stock struct {
	Dm  string `json:"dm"`
	Mc  string `json:"mc"`
	Jys string `json:"jys"`
}

type ZsInfo struct {
	H              string `json:"h"`
	L              string `json:"l"`
	O              string `json:"o"`
	Pc             string `json:"pc"`
	P              string `json:"p"`
	Turnover       string `json:"cje"`
	UpDown         string `json:"ud"`
	Volume         string `json:"v"`
	YesterdayClose string `json:"yc"`
	Time           string `json:"t"`
}

type StockData struct {
	Fm    string `json:"fm"`
	H     string `json:"h"`
	Hs    string `json:"hs"`
	Lb    string `json:"lb"`
	L     string `json:"l"`
	Lt    string `json:"lt"`
	O     string `json:"o"`
	Pe    string `json:"pe"`
	Pc    string `json:"pc"`
	P     string `json:"p"`
	Sz    string `json:"sz"`
	Cje   string `json:"cje"`
	Ud    string `json:"ud"`
	V     string `json:"v"`
	Yc    string `json:"yc"`
	Zf    string `json:"zf"`
	Zs    string `json:"zs"`
	Sjl   string `json:"sjl"`
	Zdf60 string `json:"zdf60"`
	Zdfnc string `json:"zdfnc"`
	T     string `json:"t"`
}

type Config struct {
	Licence    []string `json:"licence"`
	StockCodes []string `json:"stock_codes"`
	ZsCodes    []string `json:"zs_codes"`
	ShellType  string   `json:"shell_type"`
}

var (
	get_index      = 0
	gp_url_tmplate = "http://api.biyingapi.com/hsrl/ssjy/%s/%s" // 替换为你要访问的URL
	zs_url_tmplate = "http://api.biyingapi.com/zs/sssj/%s/%s"   // 替换为你要访问的URL
	config         Config
	code_map       = make(map[string]Stock)
	zs_map         = make(map[string]Stock)
	root_path      string
	files          []string
)

func ReadstockList() {
	filePath := "code_map.json"

	// 打开JSON文件
	file, err := os.Open(filePath)
	if err != nil {
		fmt.Println("打开文件失败:", err)
		return
	}
	defer file.Close()

	// 读取文件内容
	data, err := ioutil.ReadAll(file)
	if err != nil {
		fmt.Println("读取文件失败:", err)
		return
	}

	// 解码JSON数据到Stock结构体切片中
	var stocks []Stock
	err = json.Unmarshal(data, &stocks)
	if err != nil {
		fmt.Println("解码JSON失败:", err)
		return
	}

	for _, stock := range stocks {
		code_map[stock.Dm] = stock
	}
}

func ReadZsList() {
	filePath := "zs_map.json"

	// 打开JSON文件
	file, err := os.Open(filePath)
	if err != nil {
		fmt.Println("打开文件失败:", err)
		return
	}
	defer file.Close()

	// 读取文件内容
	data, err := ioutil.ReadAll(file)
	if err != nil {
		fmt.Println("读取文件失败:", err)
		return
	}

	// 解码JSON数据到Stock结构体切片中
	var stocks []Stock
	err = json.Unmarshal(data, &stocks)
	if err != nil {
		fmt.Println("解码JSON失败:", err)
		return
	}

	for _, stock := range stocks {
		zs_map[stock.Dm] = stock
	}
}

func ReadConfig() {

	filePath := "./config.json"

	// 打开JSON文件
	file, err := os.Open(filePath)
	if err != nil {
		fmt.Println("打开文件失败:", err)
		return
	}
	defer file.Close()

	// 读取文件内容
	data, err := ioutil.ReadAll(file)
	if err != nil {
		fmt.Println("读取文件失败:", err)
		return
	}

	err = json.Unmarshal(data, &config)
	if err != nil {
		fmt.Println("解析JSON失败:", err)
		return
	}
}

func ReadFile() {
	err := filepath.Walk(root_path, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return nil
		}

		if !info.IsDir() {
			files = append(files, path)
		}

		return nil
	})

	if err != nil {
		return
	}
}

func GetGPQuota() {
	// fmt.Printf("%-20s%-20s%-20s%-20s%-20s%-20s%-20s\n", "股票", "开盘价", "最高价", "最低价", "当前价", "涨跌幅", "更新时间")
	w := tabwriter.NewWriter(os.Stdout, 0, 0, 1, ' ', tabwriter.DiscardEmptyColumns) // 最后一个参数是选项，可以根据需求选择是否使用
	w.Write([]byte("code\tO\tH\tL\tP\tPc\n"))
	// w.Write([]byte("-----\t---\t---\t---\t---\t---\n"))
	for _, code := range config.StockCodes {
		url := fmt.Sprintf(gp_url_tmplate, code, config.Licence[get_index%len(config.Licence)])
		get_index++
		resp, err := http.Get(url)
		if err != nil {
			fmt.Println("发送GET请求失败:", err)
			return
		}
		defer resp.Body.Close()
		body, err := ioutil.ReadAll(resp.Body)
		if err != nil {
			fmt.Println("读取响应失败:", err)
			return
		}

		var stockData StockData
		err = json.Unmarshal(body, &stockData)
		if err != nil {
			fmt.Println("解析JSON失败:", err)
			return
		}
		mc_pingyin := pinyin.LazyPinyin(code_map[code].Mc, pinyin.NewArgs())
		var initial string
		for _, Hanzi := range mc_pingyin {
			initial += string(Hanzi[0])
		}
		initial = strings.ToLower(initial)
		out := fmt.Sprintf("%s\t%s\t%s\t%s\t%s\t%s\n", initial, stockData.O, stockData.H, stockData.L, stockData.P, stockData.Pc)
		w.Write([]byte(out))
	}
	w.Flush()
}

func GetZSQuota() {
	w := tabwriter.NewWriter(os.Stdout, 0, 0, 1, ' ', tabwriter.DiscardEmptyColumns) // 最后一个参数是选项，可以根据需求选择是否使用
	w.Write([]byte("code\tyc\tO\tH\tL\tP\tPc\tcje\n"))
	// w.Write([]byte("---\t---\t---\t---\t---\t---\t---\t---\n"))
	for _, code := range config.ZsCodes {
		url := fmt.Sprintf(zs_url_tmplate, code, config.Licence[get_index%len(config.Licence)])
		get_index++
		resp, err := http.Get(url)
		if err != nil {
			fmt.Println("发送GET请求失败:", err)
			return
		}
		defer resp.Body.Close()

		body, err := ioutil.ReadAll(resp.Body)
		if err != nil {
			fmt.Println("读取响应失败:", err)
			return
		}

		var stockData ZsInfo
		err = json.Unmarshal(body, &stockData)
		if err != nil {
			fmt.Println("解析JSON失败:", err)
			return
		}

		mc_pingyin := pinyin.LazyPinyin(zs_map[code].Mc, pinyin.NewArgs())
		var initial string
		for _, Hanzi := range mc_pingyin {
			initial += string(Hanzi[0])
		}
		initial = strings.ToLower(initial)

		cje := stockData.Turnover[:len(stockData.Turnover)-11]
		out := fmt.Sprintf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", initial, stockData.YesterdayClose, stockData.O, stockData.H, stockData.L, stockData.P, stockData.Pc, cje)
		w.Write([]byte(out))
	}
	w.Flush()
}

func ReadFutilityFile(filePath string) string {
	file, err := os.Open(filePath)
	if err != nil {
		fmt.Println("打开文件失败:", err)
		return ""
	}
	defer file.Close()

	// 读取文件内容
	data, err := ioutil.ReadAll(file)
	if err != nil {
		fmt.Println("读取文件失败:", err)
		return ""
	}

	return string(data)
}

func main() {

	ReadConfig()

	ReadZsList()

	ReadstockList()

	scanner := bufio.NewScanner(os.Stdin)

	for scanner.Scan() {

		dir, err := os.Getwd()
		if err != nil {
			fmt.Println("无法获取当前聚堆路径：", err)
		}

		line := scanner.Text()

		GetZSQuota()

		fmt.Println("------------------------------------------------------")

		GetGPQuota()

		out, err := exec.Command(config.ShellType, "-c", line).Output()
		if err != nil {
			fmt.Println(err)
		}

		// 将输出结果转换为字符串并打印
		fmt.Println(string(out))

		fmt.Printf("root@root:%s$", dir)
	}

}
